// 题意：给定一个由'(', ')', '[', ']'组成的括号序列，现在可以去掉一些
//       字符，使得剩下的为和法的括号序列，问最终序列可以最长的长度。
//
// 题解：f[l][r]表示[l, r]这段区间最长可以合法长度。
//       max{f[l][k]+f[k+1][r], f[l][r - 1], f[l + 1][r]}
//       如果l和r位置匹配，那么f[l+1][r-1]+2也要参与转移。
//
// run: $exec < input
// opt: 0
// flag: -g
#include <iostream>
#include <string>

int const maxn = 200;
int f[maxn][maxn];
int n;
std::string s;

bool match(char ch1, char ch2)
{
	return (ch1 == '(' && ch2 == ')') || (ch1 == '[' && ch2 == ']');
}

int dfs(int l, int r)
{
	if (l >= r) return 0;
	if (f[l][r] != -1) return f[l][r];
	int ret = 0;
	if (match(s[l - 1], s[r - 1]))
		ret = dfs(l + 1, r - 1) + 2;
	for (int i = l + 1; i < r - 1; i++) {
		int tl = dfs(l, i);
		int tr = dfs(i + 1, r);
		ret = std::max(ret, tl + tr);
	}
	ret = std::max(ret, std::max(dfs(l + 1, r), dfs(l, r - 1)));
	return f[l][r] = ret;
}

void init()
{
	for (int i = 0; i <= n; i++)
		for (int j = 0; j <= n; j++)
			f[i][j] = -1;
}

int main()
{
	while (std::cin >> s && s[0] != 'e') {
		n = s.size();
		init();
		std::cout << dfs(1, n) << '\n';
	}
}

